Background

This is my go-to template for work projects. I wanted a notebook with some minimal slide functionality without having to separate/commit whole hog to a separate ioslides output or whatever. Helps maintain flow.

Don’t want a dependency of a theme package, just plain ol HTML/CSS/JS

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 1

Plan

Gantt and ER don’t work

Flowchart

htmltools::HTML('
  <div class="mermaid">
  graph LR
      A --- B
      B-->C
      B-->D
  </div>
  ')
graph LR A --- B B-->C B-->D

User Journey

htmltools::HTML('
  <div class="mermaid">
journey
    title My working day
    section Go to work
      Make tea: 5: Me
      Go upstairs: 3: Me
      Do work: 1: Me, Cat
    section Go home
      Go downstairs: 5: Me
      Sit down: 5: Me
  </div>
  ')
journey title My working day section Go to work Make tea: 5: Me Go upstairs: 3: Me Do work: 1: Me, Cat section Go home Go downstairs: 5: Me Sit down: 5: Me

Sequence Diagram

htmltools::HTML('
  <div class="mermaid">
sequenceDiagram
    participant John
    participant Alice
    Alice->>John: Hello John, how are you?
    John-->>Alice: Great!
  </div>
  ')
sequenceDiagram participant John participant Alice Alice->>John: Hello John, how are you? John-->>Alice: Great!

Work

Data cleaning and stuff

var x = 10;

a

knitr::opts_chunk$set(echo = TRUE)
t(t(letters))
##       [,1]
##  [1,] "a" 
##  [2,] "b" 
##  [3,] "c" 
##  [4,] "d" 
##  [5,] "e" 
##  [6,] "f" 
##  [7,] "g" 
##  [8,] "h" 
##  [9,] "i" 
## [10,] "j" 
## [11,] "k" 
## [12,] "l" 
## [13,] "m" 
## [14,] "n" 
## [15,] "o" 
## [16,] "p" 
## [17,] "q" 
## [18,] "r" 
## [19,] "s" 
## [20,] "t" 
## [21,] "u" 
## [22,] "v" 
## [23,] "w" 
## [24,] "x" 
## [25,] "y" 
## [26,] "z"

b

knitr::opts_chunk$set(echo = TRUE)
letters
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"

Findings/Recommendations

This section can function as slides if there’s not too much to show. See “Slides” for slides within a tab.

Revenue is up!

mtcars

Except on Mars!

Slides

Can’t link to these

1

As you can see here, the results speak for themselves.

2

As you can see here, the results speak for themselves.

3

As you can see here, the results speak for themselves.


Appendix

This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see http://rmarkdown.rstudio.com.

R Session Info

sessionInfo()
## R version 3.5.1 (2018-07-02)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 18362)
## 
## Matrix products: default
## 
## locale:
## [1] LC_COLLATE=English_United States.1252 
## [2] LC_CTYPE=English_United States.1252   
## [3] LC_MONETARY=English_United States.1252
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.1252    
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] glue_1.3.0    dplyr_0.8.5   plotly_4.8.0  ggplot2_3.1.0
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_1.0.4           later_1.0.0          pillar_1.3.1        
##  [4] compiler_3.5.1       plyr_1.8.4           base64enc_0.1-3     
##  [7] tools_3.5.1          digest_0.6.25        viridisLite_0.3.0   
## [10] jsonlite_1.5         evaluate_0.14        tibble_2.0.1        
## [13] gtable_0.2.0         pkgconfig_2.0.2      rlang_0.4.5         
## [16] shiny_1.4.0.2        crosstalk_1.0.0      yaml_2.2.0          
## [19] xfun_0.8             fastmap_1.0.1        withr_2.1.2         
## [22] stringr_1.4.0        httr_1.4.0           knitr_1.23          
## [25] htmlwidgets_1.5.1    grid_3.5.1           tidyselect_0.2.5    
## [28] data.table_1.12.2    R6_2.3.0             rmarkdown_1.13      
## [31] tidyr_0.8.2          purrr_0.2.5          magrittr_1.5        
## [34] promises_1.1.0       scales_1.0.0         htmltools_0.4.0.9003
## [37] assertthat_0.2.0     xtable_1.8-3         mime_0.6            
## [40] colorspace_1.4-0     httpuv_1.5.2         labeling_0.3        
## [43] stringi_1.2.4        lazyeval_0.2.1       munsell_0.5.0       
## [46] crayon_1.3.4

Footnotes

library(fontawesome)
links <- sapply(c("github", "twitter", "linkedin"), fa, fill=params$social_fill) %>%
  paste(collapse="")

links <- gsub("<svg", "<a href='https://hbr.org'><svg", links)
links <- gsub("</svg", "</svg></a", links)

links <- sub("hbr.org", "github.com", links)
links <- sub("hbr.org", "twitter.com", links)
links <- sub("hbr.org", "linkedin.com", links)

  1. footnote

LS0tDQpwYXJhbXM6DQogIGppcmE6ICJIQlJBLTk5Ig0KICBnaXRodWI6ICJnaXRodWIuY29tIg0KICBjb25mbHVlbmNlOiAiaHR0cHM6Ly93d3cuYXRsYXNzaWFuLmNvbS9zb2Z0d2FyZS9jb25mbHVlbmNlIg0KICB0aXRsZTogIkFyZSB0aXRsZXMgcGhyYXNlZCBhcyBxdWVzdGlvbnMgbW9yZSBlbmdhZ2luZyB0aGFuIHN0YXRlbWVudHM/Ig0KICAjbG9nb191cmw6ICJodHRwczovL2hici5vcmcvcmVzb3VyY2VzL2Nzcy9pbWFnZXMvSEJSX2xvZ29fYmxhY2suc3ZnIg0KICBhY2NlbnRfY29sb3I6ICIjYzgyNTAyIg0KICBzb2NpYWxfZmlsbDogImJsYWNrIg0KdGl0bGU6ICdgciBwYXJhbXMkdGl0bGVgJw0KYXV0aG9yOiAiQXV0aG9ycyIgIyAnYHIgU3lzLmluZm8oKVs3XWAnDQpkYXRlOiAnYHIgU3lzLnRpbWUoKWAnDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZm9sZGluZzogaGlkZQ0KICAgIGNvZGVfZG93bmxvYWQ6IHRydWUNCiAgICBkZl9wcmludDogcGFnZWQNCiAgICBrZWVwX21kOiB0cnVlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiANCiAgICAgIGNvbGxhcHNlZDogZmFsc2UNCiAgICAgIHNtb290aF9zY3JvbGw6IGZhbHNlDQotLS0NCg0KPHN0eWxlPg0KQGltcG9ydCB1cmwoJ2h0dHBzOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Tb3VyY2UrU2FucytQcm8mZGlzcGxheT1zd2FwJyk7DQoNCmJvZHkge2ZvbnQtZmFtaWx5OiAiU291cmNlIFNhbnMgUHJvIiwgc2Fucy1zZXJpZiAhaW1wb3J0YW50O30NCmgxLCBoMiwgaDMsIGg0LCBoNSB7Zm9udC13ZWlnaHQ6IDcwMCAhaW1wb3J0YW50OyBwYWRkaW5nLXRvcDogMnJlbTt9DQphIHtjb2xvcjogYHIgcGFyYW1zJGFjY2VudF9jb2xvcmB9DQouYXV0aG9yLCAuZGF0ZSB7cGFkZGluZy10b3A6IDFyZW07fQ0KLyoNCg0KLyogLS0tLSBUT0MgLS0tLSAqLw0KLmxpc3QtZ3JvdXAtaXRlbS5hY3RpdmUsIC5saXN0LWdyb3VwLWl0ZW0uYWN0aXZlOmZvY3VzLCAubGlzdC1ncm91cC1pdGVtLmFjdGl2ZTpob3ZlciB7YmFja2dyb3VuZC1jb2xvcjogYHIgcGFyYW1zJGFjY2VudF9jb2xvcmA7IGJvcmRlci1jb2xvcjogYHIgcGFyYW1zJGFjY2VudF9jb2xvcmA7IG1hcmdpbi1sZWZ0OiAtMnJlbTsgcGFkZGluZy1sZWZ0OiAycmVtO30NCi50b2NpZnksIC5uYXYtdGFicyA+IGxpID4gYSB7d2Via2l0LWJvcmRlci1yYWRpdXM6IHVuc2V0OyBtb3otYm9yZGVyLXJhZGl1czogdW5zZXQ7IGJvcmRlci1yYWRpdXM6IHVuc2V0O30NCi50b2NpZnk6OmJlZm9yZSB7YmFja2dyb3VuZC1pbWFnZTogdXJsKGByIHBhcmFtcyRsb2dvX3VybGApOyBtYXJnaW4tYm90dG9tOiAycmVtOyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGNvbnRlbnQ6ICIiOyB3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDBweDsgYmFja2dyb3VuZC1zaXplOiAxNTBweDsgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyOyBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OyBkaXNwbGF5OiBgciBpZmVsc2UoaXMuY2hhcmFjdGVyKHBhcmFtcyRsb2dvX3VybCksICJpbmhlcml0IiwgIm5vbmUiKWB9DQoudG9jaWZ5Om50aC1jaGlsZCgxKSB1bDpudGgtY2hpbGQoMSk6OmJlZm9yZSB7Y29udGVudDogImByIHBhcmFtcyR0aXRsZWAiOyBwYWRkaW5nLWxlZnQ6IC4yNXJlbTsgcGFkZGluZy1yaWdodDogLjVyZW07IGRpc3BsYXk6IGlubGluZS1ibG9jazt9DQoudG9jaWZ5IHVsIGxpOmZpcnN0LW9mLXR5cGUge21hcmdpbi10b3A6IDFyZW07fQ0KLnRvY2lmeSB7cGFkZGluZy10b3A6IDJyZW07IHBhZGRpbmctYm90dG9tOiAycmVtO30NCi50b2NpZnktaGVhZGVyIHt0ZXh0LWluZGVudDogdW5zZXQgIWltcG9ydGFudDsgcGFkZGluZy1sZWZ0OiAycmVtO30NCnVsLnRvY2lmeS1oZWFkZXIge3BhZGRpbmctbGVmdDogMXJlbTt9DQoubmF2LXRhYnMge3BhZGRpbmctdG9wOiAxcmVtO30NCg0Kc3VtbWFyeSB7cGFkZGluZzogMXJlbTsgYm9yZGVyOiAxcHggc29saWQgI2FiYWZiMDt9DQoNCi8qIHNsaWRlIHN0dWZmICovDQoubm9zZWxlY3Qgew0KICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6IG5vbmU7IC8qIGlPUyBTYWZhcmkgKi8NCiAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOyAvKiBTYWZhcmkgKi8NCiAgICAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOyAvKiBLb25xdWVyb3IgSFRNTCAqLw0KICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7IC8qIEZpcmVmb3ggKi8NCiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOyAvKiBJbnRlcm5ldCBFeHBsb3Jlci9FZGdlICovDQogICAgICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsgLyogTm9uLXByZWZpeGVkIHZlcnNpb24sIGN1cnJlbnRseQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSBDaHJvbWUgYW5kIE9wZXJhICovDQp9DQoNCi5uYXYtYXJyb3cgeyBmb250LXNpemU6IDMwcHg7IGNvbG9yOiBgciBwYXJhbXMkYWNjZW50X2NvbG9yYDsgYmFja2dyb3VuZDogd2hpdGU7IGN1cnNvcjogcG9pbnRlcjsgZGlzcGxheTogYmxvY2s7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyLXJhZGl1czogMzBweDsgYm9yZGVyOiAxcHggc29saWQgbGlnaHRncmV5O30NCg0KLmZpeGVkLWhlaWdodCB7IG1heC1oZWlnaHQ6IDQwMHB4ICFpbXBvcnRhbnQ7IG92ZXJmbG93OiBhdXRvOyB9DQoNCi5hdXRob3IsIC5kYXRlIHsNCmRpc3BsYXk6IGlubGluZS1ibG9jazsNCmNvbG9yOiBncmV5Ow0KZm9udC13ZWlnaHQ6IG5vcm1hbCAhaW1wb3J0YW50Ow0KfQ0KDQouZGF0ZSB7DQpwYWRkaW5nLWxlZnQ6IDNyZW07DQp9DQoNCjwvc3R5bGU+DQoNCjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9tZXJtYWlkLzguNS4xL21lcm1haWQubWluLmpzIj48L3NjcmlwdD4NCg0KIyMgQmFja2dyb3VuZA0KDQpUaGlzIGlzIG15IGdvLXRvIHRlbXBsYXRlIGZvciB3b3JrIHByb2plY3RzLiBJIHdhbnRlZCBhIG5vdGVib29rIHdpdGggc29tZSBtaW5pbWFsIHNsaWRlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBoYXZpbmcgdG8gc2VwYXJhdGUvY29tbWl0IHdob2xlIGhvZyB0byBhIHNlcGFyYXRlIGlvc2xpZGVzIG91dHB1dCBvciB3aGF0ZXZlci4gSGVscHMgbWFpbnRhaW4gZmxvdy4gDQoNCkRvbid0IHdhbnQgYSBkZXBlbmRlbmN5IG9mIGEgdGhlbWUgcGFja2FnZSwganVzdCBwbGFpbiBvbCBIVE1ML0NTUy9KUw0KDQo+IExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZCBkbyBlaXVzbW9kIHRlbXBvciBpbmNpZGlkdW50IHV0IGxhYm9yZSBldCBkb2xvcmUgbWFnbmEgYWxpcXVhLiBVdCBlbmltIGFkIG1pbmltIHZlbmlhbSwgcXVpcyBub3N0cnVkIGV4ZXJjaXRhdGlvbiB1bGxhbWNvIGxhYm9yaXMgbmlzaSB1dCBhbGlxdWlwIGV4IGVhIGNvbW1vZG8gY29uc2VxdWF0LiBEdWlzIGF1dGUgaXJ1cmUgZG9sb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxsYSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5vbiBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBtb2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4gW14xXQ0KDQoNClteMV06IGZvb3Rub3RlDQoNCiMjIyBQbGFuIHsudGFic2V0fQ0KDQpHYW50dCBhbmQgRVIgZG9uJ3Qgd29yaw0KDQojIyMjIEZsb3djaGFydA0KYGBge3IsIHJlc3VsdHM9ImFzaXMifQ0KaHRtbHRvb2xzOjpIVE1MKCcNCiAgPGRpdiBjbGFzcz0ibWVybWFpZCI+DQogIGdyYXBoIExSDQogICAgICBBIC0tLSBCDQogICAgICBCLS0+Qw0KICAgICAgQi0tPkQNCiAgPC9kaXY+DQogICcpDQpgYGANCg0KIyMjIyBVc2VyIEpvdXJuZXkgDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyJ9DQpodG1sdG9vbHM6OkhUTUwoJw0KICA8ZGl2IGNsYXNzPSJtZXJtYWlkIj4NCmpvdXJuZXkNCiAgICB0aXRsZSBNeSB3b3JraW5nIGRheQ0KICAgIHNlY3Rpb24gR28gdG8gd29yaw0KICAgICAgTWFrZSB0ZWE6IDU6IE1lDQogICAgICBHbyB1cHN0YWlyczogMzogTWUNCiAgICAgIERvIHdvcms6IDE6IE1lLCBDYXQNCiAgICBzZWN0aW9uIEdvIGhvbWUNCiAgICAgIEdvIGRvd25zdGFpcnM6IDU6IE1lDQogICAgICBTaXQgZG93bjogNTogTWUNCiAgPC9kaXY+DQogICcpDQpgYGANCg0KIyMjIyBTZXF1ZW5jZSBEaWFncmFtDQpgYGB7ciwgcmVzdWx0cz0iYXNpcyJ9DQpodG1sdG9vbHM6OkhUTUwoJw0KICA8ZGl2IGNsYXNzPSJtZXJtYWlkIj4NCnNlcXVlbmNlRGlhZ3JhbQ0KICAgIHBhcnRpY2lwYW50IEpvaG4NCiAgICBwYXJ0aWNpcGFudCBBbGljZQ0KICAgIEFsaWNlLT4+Sm9objogSGVsbG8gSm9obiwgaG93IGFyZSB5b3U/DQogICAgSm9obi0tPj5BbGljZTogR3JlYXQhDQogIDwvZGl2Pg0KICAnKQ0KYGBgDQoNCiMjIFdvcmsgey50YWJzZXR9DQpEYXRhIGNsZWFuaW5nIGFuZCBzdHVmZg0KDQpgYGBqcw0KdmFyIHggPSAxMDsNCmBgYA0KDQojIyMgYSB7LmZpeGVkLWhlaWdodH0NCmBgYHtyfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KdCh0KGxldHRlcnMpKQ0KYGBgDQoNCiMjIyBiIHsuZml4ZWQtaGVpZ2h0fQ0KYGBge3J9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpsZXR0ZXJzDQpgYGANCg0KDQojIyBGaW5kaW5ncy9SZWNvbW1lbmRhdGlvbnMgey50YWJzZXR9DQpUaGlzIHNlY3Rpb24gY2FuIGZ1bmN0aW9uIGFzIHNsaWRlcyBpZiB0aGVyZSdzIG5vdCB0b28gbXVjaCB0byBzaG93LiBTZWUgIlNsaWRlcyIgZm9yIHNsaWRlcyB3aXRoaW4gYSB0YWIuDQoNCiMjIyBSZXZlbnVlIGlzIHVwIQ0KDQpgYGB7ciBjYXJzLCBjb2xzLnByaW50ID0gMywgcm93cy5wcmludCA9IDV9DQptdGNhcnMNCmBgYA0KDQojIyMgRXhjZXB0IG9uIE1hcnMhDQoNCmBgYHtyIHByZXNzdXJlLCBlY2hvPUZBTFNFLCBvdXQud2lkdGg9IjgwJSJ9DQpwbG90KHByZXNzdXJlKQ0KYGBgDQoNCg0KIyMjIFNsaWRlcyB7LnRhYnNldCAudGFibmF2fQ0KQ2FuJ3QgbGluayB0byB0aGVzZQ0KDQo8ZGl2IHN0eWxlPSJ3aWR0aDogMTAwJSAhaW1wb3J0YW50OyBwYWRkaW5nOiAxcmVtOyI+DQo8YnV0dG9uIGNsYXNzPSJuYXYtYXJyb3cgbm9zZWxlY3QiIHN0eWxlPSJmbG9hdDpsZWZ0OyB3aWR0aDogNTAlOyIgb25jbGljaz0iZ29CYWNrd2FyZCgpIj7in7U8L2J1dHRvbj4NCg0KPGJ1dHRvbiBjbGFzcz0ibmF2LWFycm93IG5vc2VsZWN0IiBzdHlsZT0id2lkdGg6IDUwJTsiIG9uY2xpY2s9ImdvRm9yd2FyZCgpIj7in7Y8L2J1dHRvbj4NCg0KPC9kaXY+DQoNCiMjIyMgYHIgbiA8LSAxOyBuYCANCkFzIHlvdSBjYW4gc2VlIGhlcmUsIHRoZSByZXN1bHRzIHNwZWFrIGZvciB0aGVtc2VsdmVzLiANCmBgYHtyIHNsaWRlIHNldHVwLCBlY2hvPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeShwbG90bHkpOyBsaWJyYXJ5KGdncGxvdDIpOyBsaWJyYXJ5KGRwbHlyKTsgbGlicmFyeShnbHVlKQ0KDQprbml0cjo6b3B0c19jaHVuayRzZXQob3V0LndpZHRoID0gIjEwMCUiKQ0KDQpnIDwtIGRhdGEuZnJhbWUoYT0xOjEwLCBiPXNhbXBsZSgxOjEwMCwgMTApKSAlPiUgDQogIHsgZ2dwbG90KC4sIGFlcyh4PWEsIHk9YikpICsgDQogICAgICBnZW9tX3BvaW50KCkgKyANCiAgICAgIGxhYnModGl0bGU9Ik15IHRpdGxlIiwgc3VidGl0bGUgPSAiQmFzZWQgb24gZGF0YSBmcm9tIDIwMjAtMDEgdG8gMjAyMC0wMiIsIGNhcHRpb24gPSAibXkgY2FwdGlvbiIpDQogIH0gDQoNCmcgDQpgYGANCg0KIyMjIyBgciBuIDwtIG4rMTsgbmANCkFzIHlvdSBjYW4gc2VlIGhlcmUsIHRoZSByZXN1bHRzIHNwZWFrIGZvciB0aGVtc2VsdmVzLiANCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpnZ3Bsb3RseShnKSAlPiUNCiAgbGF5b3V0KHRpdGxlID0gZ2x1ZSgie3RpdGxlfTxicj48c3VwPntzdWJ0aXRsZX08L3N1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgIHRpdGxlID0gZyRsYWJlbHMkdGl0bGUsDQogICAgICAgICAgICAgICAgICAgICAgc3VidGl0bGUgPSBnJGxhYmVscyRzdWJ0aXRsZQ0KICAgICAgICAgICAgICAgICAgICAgICkgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICApDQpgYGANCg0KIyMjIyBgciBuIDwtIG4rMTsgbmANCkFzIHlvdSBjYW4gc2VlIGhlcmUsIHRoZSByZXN1bHRzIHNwZWFrIGZvciB0aGVtc2VsdmVzLiANCmBgYHtyIGVjaG89RkFMU0UsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpkYXRhLmZyYW1lKGE9MToxMCwgYj1zYW1wbGUoMToxMDAsIDEwKSkgJT4lIHsgZ2dwbG90KC4sIGFlcyh4PWEsIHk9YikpICsgZ2VvbV9wb2ludCgpfSAlPiUgZ2dwbG90bHkoLikNCmBgYA0KDQoNCi0tLQ0KDQojIyBBcHBlbmRpeA0KDQpUaGlzIGlzIGFuIFIgTWFya2Rvd24gZG9jdW1lbnQuIE1hcmtkb3duIGlzIGEgc2ltcGxlIGZvcm1hdHRpbmcgc3ludGF4IGZvciBhdXRob3JpbmcgSFRNTCwgUERGLCBhbmQgTVMgV29yZCBkb2N1bWVudHMuIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgUiBNYXJrZG93biBzZWUgPGh0dHA6Ly9ybWFya2Rvd24ucnN0dWRpby5jb20+Lg0KDQo8ZGV0YWlscz48c3VtbWFyeT5SIFNlc3Npb24gSW5mbzwvc3VtbWFyeT4NCg0KYGBge3J9DQpzZXNzaW9uSW5mbygpDQpgYGANCg0KPC9kZXRhaWxzPg0KDQo8c3R5bGU+DQouZm9vdG5vdGVzIGhyIHtkaXNwbGF5OiBub25lO30NCjwvc3R5bGU+DQoNCiMjIEZvb3Rub3Rlcw0KDQpgYGB7cn0NCmxpYnJhcnkoZm9udGF3ZXNvbWUpDQpsaW5rcyA8LSBzYXBwbHkoYygiZ2l0aHViIiwgInR3aXR0ZXIiLCAibGlua2VkaW4iKSwgZmEsIGZpbGw9cGFyYW1zJHNvY2lhbF9maWxsKSAlPiUNCiAgcGFzdGUoY29sbGFwc2U9IiIpDQoNCmxpbmtzIDwtIGdzdWIoIjxzdmciLCAiPGEgaHJlZj0naHR0cHM6Ly9oYnIub3JnJz48c3ZnIiwgbGlua3MpDQpsaW5rcyA8LSBnc3ViKCI8L3N2ZyIsICI8L3N2Zz48L2EiLCBsaW5rcykNCg0KbGlua3MgPC0gc3ViKCJoYnIub3JnIiwgImdpdGh1Yi5jb20iLCBsaW5rcykNCmxpbmtzIDwtIHN1YigiaGJyLm9yZyIsICJ0d2l0dGVyLmNvbSIsIGxpbmtzKQ0KbGlua3MgPC0gc3ViKCJoYnIub3JnIiwgImxpbmtlZGluLmNvbSIsIGxpbmtzKQ0KDQpgYGANCg0KPHN0eWxlPg0KW2lkKj0idG9jaWZ5LWhlYWRlciJdOmxhc3Qtb2YtdHlwZSB7DQpmb250LXNpemU6IDNyZW07DQpjdXJzb3I6IHVuc2V0Ow0KbGV0dGVyLXNwYWNpbmc6IDJyZW07DQp9DQphIHN2Zzpob3ZlciB7DQpmb250LXNpemU6IDEyMCUgIWltcG9ydGFudDsNCn0NCiNzb2NpYWwtbGlua3Mge2Rpc3BsYXk6bm9uZTt9DQo8L3N0eWxlPg0KDQojIyBgciBsaW5rc2AgeyNzb2NpYWwtbGlua3N9DQoNCjxzY3JpcHQ+DQp2YXIgY29uZmlnID0gew0KICAgIHN0YXJ0T25Mb2FkOnRydWUsDQogICAgZmxvd2NoYXJ0OnsNCiAgICAgICAgdXNlTWF4V2lkdGg6ZmFsc2UsDQogICAgICAgIGh0bWxMYWJlbHM6dHJ1ZQ0KICAgIH0NCn07DQptZXJtYWlkLmluaXRpYWxpemUoY29uZmlnKTsNCiAgICANCmZ1bmN0aW9uIGdvQmFja3dhcmQoKSB7DQogIGxldCBwcmV2aW91cyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnRhYm5hdiA+IHVsLm5hdiA+IGxpIikpLmluZGV4T2YoZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRhYm5hdiA+IHVsLm5hdiA+IGxpLmFjdGl2ZSIpKS0xOw0KICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCIudGFibmF2ID4gdWwubmF2ID4gbGkgPiBhIilbcHJldmlvdXNdLmNsaWNrKCkNCn07DQoNCmZ1bmN0aW9uIGdvRm9yd2FyZCgpIHsNCiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLnRhYm5hdiA+IHVsLm5hdiA+IGxpLmFjdGl2ZSArIGxpID4gYSIpLmNsaWNrKCk7DQp9Ow0KPC9zY3JpcHQ+DQoNCg==